package com.fatri.lessionsimple.util.study


class InlineDemo {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {

            /**
             * 情况1，正常打印ab
             * 因为普通lambda表达式相当于匿名内部类的方法，只能中断自身函数，无法中断外部函数
             */
            commontest {
                println("commontest")
                return@commontest
                println("hello")
            }
            println("a")
            println("b")

            /**
             *
             * 情况2，无法打印 ab，
             * 因为inline修饰的test1的lambda表达式相当于平铺在main函数里，等价于
             *      println("test1")
             *      return
             *      println("a")
             *      println("b")
             */
//            test1 {
//                println("test1")
//                return
//            }
//            println("a")
//            println("b")


            /**
             * 情况3，hello不打印，ab正常打印
             * 被crossinline修饰的lambda表达式，不会被平铺拷贝到调用处，
             * 相当于new Function().invoke()，是Function里面被return，不影响外部函数的执行
             *
             * 简而言之，与情况1相同，inline+crossinline组合等于白瞎
             *                     inline+noinline也是相同
             *
             */
            crosstest1 {
                println("crosstest1")
                return@crosstest1  //中断自身表达式
                println("hello")
            }
            println("a")
            println("b")
        }
    }


}

fun commontest(l: () -> Unit) {
    l.invoke()
    return
}

inline fun test1(l: () -> Unit) {
    l.invoke()
    return
}

inline fun crosstest1(noinline l: () -> Unit) {
    l.invoke()
    return
}